﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using BasicForms;
using Lists;
using GeneralLibs;
using DevExpress.XtraGrid;
using CustomSecurity;
using Excel = Microsoft.Office.Interop.Excel;

namespace KiemKe
{
    public partial class FrmThongKeHangDaKiemKeTheoNhomVaThoiDiem : BasicForms.FrmSupportPrintableComponents
    {
        public FrmThongKeHangDaKiemKeTheoNhomVaThoiDiem()
        {
            InitializeComponent();
        }

        private void FrmThongKeHangDaKiemKe_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;
            try
            {
                cmbKyBaoCao.SelectedText = "Tùy chọn";

                cmbKho.DataSource = DanhMucKho.Instance.DataView;
                cmbKho.DisplayColumn = "Ten";
                cmbKho.ValueColumn = "ID";
                cmbKho.AddVisibleColumn("Ma", "Mã");
                cmbKho.AddVisibleColumn("Ten", "Tên");

                cmbThoiDiemKhoaSoTinhGiaVon.DataSource = DanhMucThoiDiemKhoaSo.GetCacThoiDiemChotSoDu().DataView;
                cmbThoiDiemKhoaSoTinhGiaVon.DisplayColumn = "ThoiDiem";
                cmbThoiDiemKhoaSoTinhGiaVon.ValueColumn = "ID";
                cmbThoiDiemKhoaSoTinhGiaVon.AddVisibleColumn("ThoiDiem", "Thời điểm");
                cmbThoiDiemKhoaSoTinhGiaVon.AddVisibleColumn("DienGiai", "Diễn giải");

                nmrPhanTram.Text = "0";

                rdoGiaVonConTrongKho.Checked = false;
                rdoGiaVonMuaVao.Checked = true;

                colTontheoMay.Visible = false;
                colSoLuongMat.Visible = false;
                colGiaVonTheoMay.Visible = true;

                foreach (DevExpress.XtraGrid.Columns.GridColumn column in gridViewDs.Columns)
                {
                    column.OptionsFilter.AutoFilterCondition = DevExpress.XtraGrid.Columns.AutoFilterCondition.Contains;
                }
                foreach (DevExpress.XtraGrid.Columns.GridColumn column in gridView.Columns)
                {
                    column.OptionsFilter.AutoFilterCondition = DevExpress.XtraGrid.Columns.AutoFilterCondition.Contains;
                }

                dsThongKeHangKiemKe.NhomVatTuHangHoa.Merge(DanhMucNhomVatTuHangHoa.Instance.DataTable);
                gridControlDs.DataSource = dsThongKeHangKiemKe.NhomVatTuHangHoa;
            }
            catch (Exception ex)
            {
            }

            foreach (DevExpress.XtraGrid.Columns.GridColumn column in gridView.Columns)
            {
                column.OptionsFilter.AutoFilterCondition = DevExpress.XtraGrid.Columns.AutoFilterCondition.Contains;
            }
        }

        private void cmbKyBaoCao_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                FrmThamSoBaoCao.ThietLapKhoangThoiGianBaoCao(cmbKyBaoCao.Text, cmbKyBaoCao, dtNgayBatDau, dtNgayKetThuc);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbKho_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete) cmbKho.EditValue = Guid.Empty;
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            if (cmbThoiDiemKhoaSoTinhGiaVon.EditValue == null || !(cmbThoiDiemKhoaSoTinhGiaVon.EditValue is Guid)
                || (Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue == Guid.Empty)
            {
                FrmWarning.Show("Thông báo", "Cần chọn thời điểm tại Điều kiện khác để xác định thời gian tính giá vốn");
                cmbThoiDiemKhoaSoTinhGiaVon.Focus();
                return;
            }

            Guid khoID = Guid.Empty;
            DateTime ngayBatDau = dtNgayBatDau.DateTime;
            DateTime ngayKetThuc = dtNgayKetThuc.DateTime;

            if (cmbKho.EditValue is Guid && (Guid)cmbKho.EditValue != Guid.Empty) khoID = (Guid)cmbKho.EditValue;

            string kyBaoCao = cmbKyBaoCao.Text;
            if (kyBaoCao == "Cả năm") kyBaoCao = "Năm " + GeneralLibs.Config.NamTaiChinh.ToString();
            else if (kyBaoCao == "Tùy chọn") kyBaoCao = string.Format("Từ ngày {0}/{1}/{2} đến ngày {3}/{4}/{5}",
                                       ngayBatDau.Day, ngayBatDau.Month, ngayBatDau.Year,
                                       ngayKetThuc.Day, ngayKetThuc.Month, ngayKetThuc.Year);

            BasicForms.FrmProgressBar.StartShowProgress();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);


            //Hàng nào không có thời gian kết thúc kiểm kê coi như là nhóm con, không tính
            //Cách tính
            //B1: tính toán số lượng kiểm kê ra, với khoảng thời gian kiểm kê như như bình thường
            try
            {
                SqlCommand cmd = con.CreateCommand();
                con.Open();

                if (khoID != Guid.Empty && cmbKho.Text != "")
                {
                    cmd.CommandText = string.Format("SELECT  D.ID VatTuHangHoaID, D.Ma MaHang, D.Ten TenHang, E.Ten TenNhom, D.GiaBia, C.Value12 GiaBiaKhiKiemKe, C.Value12 * SUM(C.Value1) ThanhTienGiaBiaKhiKiemKe, \n" +
                                                   "   C.Value8 ChietKhauMua, D.DonViTinh,D.TacGia,D.NhaXuatBan, SUM(C.Value1) SoLuongTon, \n" +
                                                   "CASE WHEN SUM(C.Value1) >0 THEN SUM(C.Value3)/SUM(C.Value1)ELSE CAST(0 AS money) END DonGiaVon , SUM(C.Value3) ThanhTienVon \n " +
                                                   "FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID  \n " +
                                                   "    INNER JOIN  KhoanMucChungTu C ON A.ChungTuID = C.ChungTuID  \n " +
                                                   "    LEFT JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID  \n " +
                                                   "    LEFT JOIN NhomVatTuHangHoa E ON D.NhomVatTuHangHoaID = E.ID \n " +
                                                   "WHERE LCT.Ma = N'PhieuKiemKe'  \n " +
                                                   "AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi  \n" +
                                                   "AND A.Kho1ID = '{0}'  \n" +
                                                   "GROUP BY  D.ID, D.Ma, D.Ten, E.Ten, D.GiaBia, D.ChietKhauMua, D.DonViTinh, D.TacGia, D.NhaXuatBan, C.Value8, C.Value12 \n" +
                                                   "ORDER BY D.Ten ",
                                                   khoID);
                }
                else
                {
                    cmd.CommandText = string.Format("SELECT  D.ID VatTuHangHoaID, D.Ma MaHang, D.Ten TenHang, E.Ten TenNhom, D.GiaBia, C.Value12 GiaBiaKhiKiemKe, C.Value12 * SUM(C.Value1) ThanhTienGiaBiaKhiKiemKe, \n" +
                                                  "   C.Value8 ChietKhauMua, D.DonViTinh,D.TacGia,D.NhaXuatBan, SUM(C.Value1) SoLuongTon, \n" +
                                                  "CASE WHEN SUM(C.Value1) >0 THEN SUM(C.Value3)/SUM(C.Value1)ELSE CAST(0 AS money) END DonGiaVon , SUM(C.Value3) ThanhTienVon \n " +
                                                  "FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID  \n " +
                                                  "    INNER JOIN  KhoanMucChungTu C ON A.ChungTuID = C.ChungTuID  \n " +
                                                  "    LEFT JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID  \n " +
                                                  "    LEFT JOIN NhomVatTuHangHoa E ON D.NhomVatTuHangHoaID = E.ID \n " +
                                                  "WHERE LCT.Ma = N'PhieuKiemKe'  \n " +
                                                  "AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi  \n" +
                                                  "GROUP BY  D.ID, D.Ma, D.Ten, E.Ten, D.GiaBia, D.ChietKhauMua, D.DonViTinh, D.TacGia, D.NhaXuatBan, C.Value8, C.Value12 \n" +
                                                  "ORDER BY D.Ten ");
                }

                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("@ThoiDiemCuoi", ngayKetThuc);

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                dsThongKeHangKiemKe.HangKiemKe.Clear();
                da.Fill(dsThongKeHangKiemKe.HangKiemKe);

                //Lọc những hàng trùng nhau trong danh sách đã sắp xếp. Tính chiết khấu trung bình.
                DataRow beforeRow = null;
                DataRow currRow = null;
                int i = 1;
                while (dsThongKeHangKiemKe.HangKiemKe.Rows.Count > i)
                {
                    beforeRow = dsThongKeHangKiemKe.HangKiemKe.Rows[i - 1];
                    currRow = dsThongKeHangKiemKe.HangKiemKe.Rows[i];
                    if (beforeRow["VatTuHangHoaID"] is Guid && currRow["VatTuHangHoaID"] is Guid && (Guid)beforeRow["VatTuHangHoaID"] == (Guid)currRow["VatTuHangHoaID"])
                    {
                        currRow["ChietKhauMua"] = Math.Round(((decimal)beforeRow["ChietKhauMua"] * (decimal)beforeRow["SoLuongTon"] + (decimal)currRow["ChietKhauMua"] * (decimal)currRow["SoLuongTon"]) / ((decimal)beforeRow["SoLuongTon"] + (decimal)currRow["SoLuongTon"]), 1);
                        currRow["SoLuongTon"] = (decimal)beforeRow["SoLuongTon"] + (decimal)currRow["SoLuongTon"];
                        currRow["DonGiaVon"] = Math.Round((decimal)currRow["GiaBia"] * ((100 - (decimal)currRow["ChietKhauMua"]) / 100));
                        //currRow["ThanhTienVon"] = (decimal)currRow["SoLuongTon"] * (decimal)currRow["DonGiaVon"];
                        beforeRow.Delete();
                    }
                    i++;
                }

                //B2: tính số lượng xuất ra theo từng nhóm hàng theo thời gian kiểm kê xong
                dsThongKeHangKiemKe.AcceptChanges(); //Chấp nhận các thay đổi ở trên thì mới foreach được ở dưới
                TonKho phatSinhNhap = null;
                TonKho phatSinhXuat = null;
                DateTime? ngayKetThucKiemKeTheoNhom = null;
                ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemChotSoDuGanNhat(ngayKetThuc);
                int count = 0;

                ThoiDiemKhoaSo thoiDiemKhoaSoTinhGiaVon = thoiDiemKhoaSoGanNhat;
                if (cmbThoiDiemKhoaSoTinhGiaVon.EditValue != null && cmbThoiDiemKhoaSoTinhGiaVon.EditValue is Guid
                    && (Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue != Guid.Empty)
                    thoiDiemKhoaSoTinhGiaVon = DanhMucThoiDiemKhoaSo.Instance.GetByID((Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue);

                foreach (DataRow row in dsThongKeHangKiemKe.HangKiemKe)
                {
                    FrmProgressBar.Status = string.Format("Đang tính số lượng bán ra của {0}/{1} hàng", ++count, dsThongKeHangKiemKe.HangKiemKe.Rows.Count);
                    VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoaID"]);
                    NhomVatTuHangHoa nhomVTHH = DanhMucNhomVatTuHangHoa.Instance.GetByID(vthh.NhomVatTuHangHoa.ID);
                    if (nhomVTHH != null)
                    {
                        DataRow rowNhom = dsThongKeHangKiemKe.NhomVatTuHangHoa.Select(string.Format("ID = '{0}'", nhomVTHH.ID))[0];
                        if (rowNhom != null && rowNhom["NgayKetThucKiemKe"] is DateTime)
                            ngayKetThucKiemKeTheoNhom = (DateTime)rowNhom["NgayKetThucKiemKe"];
                        else
                            ngayKetThucKiemKeTheoNhom = null;
                    }

                    if (ngayKetThucKiemKeTheoNhom != null)
                    {
                        DateTime ngayBatDauTinhNhap = (DateTime)ngayKetThucKiemKeTheoNhom;
                        if (khoID != Guid.Empty && cmbKho.Text != "")
                        {
                            phatSinhNhap = TonKho.CalculatePhatSinhNhap(cmd, ngayBatDauTinhNhap, ngayKetThuc, khoID, vthh.ID);
                            phatSinhXuat = TonKho.CalculatePhatSinhXuat(cmd, ngayBatDauTinhNhap, ngayKetThuc, khoID, vthh.ID);
                        }
                        else
                        {
                            phatSinhNhap = TonKho.CalculatePhatSinhNhapToanBo(cmd, ngayBatDauTinhNhap, ngayKetThuc, vthh.ID);
                            phatSinhXuat = TonKho.CalculatePhatSinhXuatToanBo(cmd, ngayBatDauTinhNhap, ngayKetThuc, vthh.ID);
                        }

                        row["SoLuongMuaVao"] = phatSinhNhap.SoLuong;
                        row["SoLuongBanRa"] = phatSinhXuat.SoLuong;
                    }

                    //Tính giá vốn
                    //Giá vốn theo máy
                    decimal donGiaVonTheoMay = 0;
                    if (rdoGiaVonConTrongKho.Checked)
                    {
                        if (khoID != Guid.Empty && cmbKho.Text != "")
                        {
                            donGiaVonTheoMay = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonTrungBinhTheoGiaTriConLaiToanBoTheoKhoByID(
                                                                                vthh.ID, khoID, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, ngayKetThuc);
                        }
                        else
                        {
                            donGiaVonTheoMay = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonTrungBinhTheoGiaTriConLaiToanBoCacKhoByID(
                                                                                vthh.ID, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, ngayKetThuc);
                        }
                    }
                    else if (rdoGiaVonMuaVao.Checked)
                    {
                        if (khoID != Guid.Empty && cmbKho.Text != "")
                        {
                            donGiaVonTheoMay = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoTheoKhoByID(
                                                                                vthh.ID, khoID, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, ngayKetThuc);
                        }
                        else
                        {
                            donGiaVonTheoMay = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoCacKhoByID(
                                                                                vthh.ID, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, ngayKetThuc);
                        }
                    }

                    row["GiaVonTheoMay"] = donGiaVonTheoMay;
                }

                BasicForms.FrmProgressBar.StartShowProgress();
                int total = dsThongKeHangKiemKe.HangKiemKe.Rows.Count;
                count = 0;

                //So sánh tồn theo máy với kiểm kê
                if (chkTinhTonTheoMay.Checked)
                {
                    count = 0;
                    foreach (DataRow row in dsThongKeHangKiemKe.HangKiemKe.Rows)
                    {
                        FrmProgressBar.Status = string.Format("Đang tính tồn của {0}/{1} hàng", ++count, dsThongKeHangKiemKe.HangKiemKe.Rows.Count);
                        if (row.RowState != DataRowState.Deleted)
                        {
                            try
                            {
                                VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByProperty("Ma", row["MaHang"]);
                                TonKho tonTheoKho = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, ngayKetThuc, khoID, vthh.ID);
                                TonKho tonToanBo = TonKho.CalculateTongTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVao(cmd, ngayKetThuc, vthh.ID);
                                if (tonTheoKho.SoLuong is decimal) row["TonTheoKho"] = tonTheoKho.SoLuong;
                                if (tonToanBo.SoLuong is decimal) row["TonTheoMay"] = tonToanBo.SoLuong;

                               
                                decimal tonThucTe = (decimal)row["SoLuongTon"];
                                row["ThanhTienVon"] = tonThucTe * (decimal)row["GiaVonTheoMay"];
                                row["SoLuongMat"] = tonThucTe - tonTheoKho.SoLuong;
                            }
                            catch (Exception ex)
                            {
                            }
                        }
                    }

                    colTonTheoKho.Visible = true;
                    colTontheoMay.Visible = true;
                    colSoLuongMat.Visible = true;
                    //colGiaVonTheoMay.Visible = true;
                }
                else
                {
                    colTonTheoKho.Visible = false;
                    colTontheoMay.Visible = false;
                    colSoLuongMat.Visible = false;
                    //colGiaVonTheoMay.Visible = false;
                }
                gridControl.DataSource = dsThongKeHangKiemKe.HangKiemKe;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
                con = null;
            }
            BasicForms.FrmProgressBar.FinishShowProgress();

            FormatNumberInGridView(gridView);
        }

        private void btnPreview_Click(object sender, EventArgs e)
        {
            string ngayThongKe = string.Format("Ngày : {0}", System.DateTime.Now);
            PrintWithHeaderAndFooter(true, gridControl, true, true, "DANH SÁCH HÀNG HÓA THỐNG KÊ KIỂM KÊ", "", ngayThongKe, "", "");
        }
        private void btnXemBaoCaoNhom_Click(object sender, EventArgs e)
        {
            string ngayThongKe = string.Format("Ngày : {0}", System.DateTime.Now);
            PrintWithHeaderAndFooter(true, gridControlDs, true, true, "DANH SÁCH NHÓM HÀNG VÀ THỜI GIAN KIỂM KÊ", "", ngayThongKe, "", "");
        }

        private void TinhToanGiaVon()
        {
            ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemChotSoDuGanNhat(dtNgayKetThuc.DateTime);
            ThoiDiemKhoaSo thoiDiemKhoaSoTinhGiaVon = thoiDiemKhoaSoGanNhat;
            if (cmbThoiDiemKhoaSoTinhGiaVon.EditValue != null && cmbThoiDiemKhoaSoTinhGiaVon.EditValue is Guid
                && (Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue != Guid.Empty)
                thoiDiemKhoaSoTinhGiaVon = DanhMucThoiDiemKhoaSo.Instance.GetByID((Guid)cmbThoiDiemKhoaSoTinhGiaVon.EditValue);

            BasicForms.FrmProgressBar.StartShowProgress();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                SqlCommand cmd = con.CreateCommand();
                con.Open();
                FrmProgressBar.StartShowProgress();
                int count = 1, total = dsThongKeHangKiemKe.HangKiemKe.Rows.Count;
                foreach (DataRow row in dsThongKeHangKiemKe.HangKiemKe.Rows)
                {
                    if (row.RowState != DataRowState.Deleted)
                    {
                        if (row["VatTuHangHoaID"] is Guid && (Guid)row["VatTuHangHoaID"] != Guid.Empty) //Đảm bảo là hàng có giá trị
                        {
                            if (cmbKho.EditValue != null && cmbKho.EditValue is Guid && (Guid)cmbKho.EditValue != Guid.Empty) //Tính giá vốn theo kho
                            {
                                decimal donGiaVon = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoTheoKhoByID(
                                    (Guid)row["VatTuHangHoaID"], (Guid)cmbKho.EditValue, thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, dtNgayKetThuc.DateTime);
                                row["DonGiaVon"] = donGiaVon;
                                row["ThanhTienVon"] = donGiaVon * (decimal)row["SoLuongTon"];
                            }
                            else //Tính toán bộ các kho
                            {
                                decimal donGiaVon = (decimal)DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoCacKhoByID(
                                        (Guid)row["VatTuHangHoaID"], thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoTinhGiaVon.ThoiDiem, dtNgayKetThuc.DateTime);
                                row["DonGiaVon"] = donGiaVon;
                                row["ThanhTienVon"] = donGiaVon * (decimal)row["SoLuongTon"];
                            }
                        }
                    }
                    FrmProgressBar.Status = string.Format("Đã xử lý được {0}/{1}", count++, total);
                }

                gridControl.DataSource = dsThongKeHangKiemKe.HangKiemKe;
                cmbThoiDiemKhoaSoTinhGiaVon.Visible = false;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
                con = null;
            }
            BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void cmbThoiDiemKhoaSoTinhGiaVon_EditValueChanged(object sender, EventArgs e)
        {

        }

        private void nmrPhanTram_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnUpdateHangKDung_Click(object sender, EventArgs e)
        {
            if (gridControl.DataSource != null &&
                MessageBox.Show("Bạn có chắc chắn muốn chuyển những hàng không có trong danh sách kiểm kê sang không dùng?", "Xác nhận",
                MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
                try
                {
                    con.Open();
                    SqlCommand cmd = con.CreateCommand();
                    cmd.CommandText = string.Format("UPDATE VatTuHangHoa SET TrangThai = 0\n" +
                                                    "WHERE ID NOT IN( \n" +
                                                    "	SELECT DISTINCT B.VatTuHangHoa1ID  \n" +
                                                    "	FROM ChungTu A INNER JOIN KhoanMucChungTu B ON A.ChungTuID = B.ChungTuID \n" +
                                                    "		INNER JOIN LoaiChungTu C ON A.LoaiChungTuID = C.ID AND C.Ma = 'PhieuKiemKe' \n" +
                                                    "	WHERE @NgayBatDau <= A.Ngay AND A.Ngay <= @NgayKetThuc  \n" +
                                                    ") \n");
                    cmd.Parameters.Clear();
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@NgayBatDau", dtNgayBatDau.DateTime);
                    cmd.Parameters.AddWithValue("@NgayKetThuc", dtNgayKetThuc.DateTime);
                    FrmProgressBar.StartShowProgress("Đang cập nhật danh mục hàng hóa");
                    cmd.ExecuteNonQuery();
                    FrmProgressBar.FinishShowProgress();
                    FrmWarning.Show("Thông báo", "Đã cập nhật xong");
                }
                catch (Exception ex)
                {
                    BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                }
                finally
                {
                    con.Close();
                    FrmProgressBar.FinishShowProgress();
                }
            }
        }

        private void btnImportExcel_Click(object sender, EventArgs e)
        {
            bool chkNeedExportExcel = false;
            //DataTable dtInportExcelError = PreparingTable();
            try
            {
                //if (NeedCheckFullInfo != null) NeedCheckFullInfo(this);
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Excel file|*.xlsx;*.xls";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    BasicForms.FrmProgressBar.StartShowProgress();

                    string path = openFileDialog.FileName;
                    Excel.ApplicationClass app = new Microsoft.Office.Interop.Excel.ApplicationClass();
                    Excel.Workbook workBook = app.Workbooks.Open(path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t",
                                    false, false, 0, true, 1, 0);
                    Excel.Worksheet workSheet = (Excel.Worksheet)workBook.ActiveSheet;
                    Excel.Range range = workSheet.UsedRange;

                    if (range.Columns.Count >= 4)
                    {
                        for (int rowIndex = 2; rowIndex <= range.Rows.Count; rowIndex++)
                        {
                            try
                            {
                                string maNhom = "";
                                string tenNhom = "";
                                DateTime ngayKetThucKiemKe = new DateTime();
                                NhomVatTuHangHoa nhomVTHH = null;

                                #region Doc cac o du lieu tu Excel va Check hop le
                                try
                                {
                                    maNhom = (range.Cells[rowIndex, 2] as Excel.Range).Text.ToString().Trim();
                                }
                                catch (Exception ex)
                                { }
                                try
                                {
                                    tenNhom = (range.Cells[rowIndex, 3] as Excel.Range).Value2.ToString().Trim();
                                }
                                catch (Exception ex)
                                { }
                                try
                                {
                                    ngayKetThucKiemKe = DateTime.Parse((range.Cells[rowIndex, 4] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                { }

                                if (maNhom == "")
                                {
                                    MessageBox.Show(string.Format("Mã nhóm ở dòng số {0} không hợp lệ", rowIndex - 1));
                                    continue;
                                }
                                #endregion

                                //nhomVTHH = Lists.DanhMucNhomVatTuHangHoa.Instance.GetByProperty("Ma", maNhom);

                                //Check các điều kiện về thời gian
                                //1. Ngày xong kiểm kê phải trước ngày chốt sổ
                                if (ngayKetThucKiemKe.Year == 1) //Hàng không có dữ liệu --> bỏ qua
                                {
                                    continue;
                                }
                                int a = DateTime.Compare(ngayKetThucKiemKe, dtNgayKetThuc.DateTime);
                                if (ngayKetThucKiemKe >= dtNgayKetThuc.DateTime)
                                {
                                    MessageBox.Show(string.Format("Thời gian kết thúc kiểm kê phải xong trước thời gian chốt sổ - \n" +
                                                                    "dòng số {0} của mã nhóm '{1}' không hợp lệ", rowIndex - 1, maNhom));
                                    continue;
                                }
                                if (ngayKetThucKiemKe < dtNgayBatDau.DateTime || ngayKetThucKiemKe >= dtNgayKetThuc.DateTime)
                                {
                                    MessageBox.Show(string.Format("Thời gian kết thúc kiểm kê phải trong khoảng thời gian chạy báo cáo - \n" +
                                                                    "dòng số {0} của mã nhóm '{1}' không hợp lệ", rowIndex - 1, maNhom));
                                    continue;
                                }


                                DataRow[] rows = dsThongKeHangKiemKe.NhomVatTuHangHoa.Select(string.Format("Ma = '{0}'", maNhom));
                                foreach (DataRow row in rows)
                                {
                                    row["NgayKetThucKiemKe"] = ngayKetThucKiemKe;
                                }
                            }
                            catch (SqlException sqlEx)
                            {
                                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                            }
                            catch (Exception ex)
                            {
                                if (ex is CustomException) throw ex;
                                else
                                {
                                    throw new Exception(ex.Message);
                                }
                            }
                        }
                    }
                    workBook.Close(false, path, true);
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }
    }
}
